#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

// 设置最大缓存区
#define QUEUE_LEN 5


// 初始化锁
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 初始化 条件变量
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;


static int buff[QUEUE_LEN];

static int cont = 0;

// 生产线程
void *Production_callback(void *argv)
{
    // 生产的内容
    int number = 1;
    while (1)
    {
        // 获取锁
        pthread_mutex_lock(&mutex);

        // 判断当前队列是否等于最大长度
        while (cont == QUEUE_LEN)
        {
            // 展示释放锁  让别的线程执行
            pthread_cond_wait(&cond, &mutex);
        }

        // 写入队列
        buff[cont++] = number++;

        printf("在第%d写入%d\n", cont-1, buff[cont-1]);

        // 唤醒
        pthread_cond_signal(&cond);

        // 释放锁
        pthread_mutex_unlock(&mutex);
    }
}

// 消费线程
void *ConSumer_Callback(void *argv)
{
    while (1)
    {
        // 获取锁
        pthread_mutex_lock(&mutex);    

        // 判断当前队列是否等于最大长度
        while (cont== 0)
        {
            // 展示释放锁  让别的线程执行
            pthread_cond_wait(&cond, &mutex);
        }

        // 读出队列 读出

        --cont;

        printf("在第%d读出%d\n", cont, buff[cont]);


        // 唤醒
        pthread_cond_signal(&cond);

        // 释放锁
        pthread_mutex_unlock(&mutex);
    }
}

int main(int argc, char const *argv[])
{
    // 创建2个线程  一个生产 一个消费
    pthread_t producer_thread, consumer_thread;
    pthread_create(&producer_thread, NULL, Production_callback, NULL); // 生产
    pthread_create(&consumer_thread, NULL, ConSumer_Callback, NULL);

    // 等待子线程结束
    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);

    return 0;
}
